﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Entidades.Sistema.Venta;
using Entidades.Seguridad;
using DevExpress.Web.ASPxEditors;
using DevExpress.Web.Mvc;
using System.Globalization;
using Modelo.Sistema.Venta;
using Modelo.Sistema.Produccion;
using System.Web.Script.Serialization;

namespace VistaOnlineR1._1.Controllers.Sistema.Venta
{
    [Authorize(Roles = "Ventas")]
    public partial class ProductosController : BaseController
    {
        #region campos        
        CatalogoProductos _catalogoProductos;
        CatalogoTipoProducto _catalogoTipoProducto;
        CatalogoUnidad _catalogoUnidad;
        CatalogoPedidos _catalogoPedidos;
        CatalogoReceta _catalogoReceta;
        #endregion

        #region Constructors
        public ProductosController()
            : this(new CatalogoProductos(), new CatalogoTipoProducto(), new CatalogoUnidad(), new CatalogoPedidos(), new CatalogoReceta())
        {
        }

        public ProductosController(CatalogoProductos catalogoProductos, CatalogoTipoProducto catalogoTipoProducto, CatalogoUnidad catalogoUnidad, CatalogoPedidos catalogoPedidos, CatalogoReceta catalogoReceta)
        {
            _catalogoProductos = catalogoProductos;
            _catalogoTipoProducto = catalogoTipoProducto;
            _catalogoUnidad = catalogoUnidad;
            _catalogoPedidos = catalogoPedidos;
            _catalogoReceta = catalogoReceta;
        }
        #endregion

        public ActionResult Index()
        {
            List<Perfil> perfiles = RecuperarPerfil();

            ViewBag.PermisoDelete = perfiles.Exists(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCreate = perfiles.Exists(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEdit = perfiles.Exists(per => per.Permiso.Nombre == "Edit");

            ViewBag.TipoProductos = _catalogoTipoProducto.ListarTipoProductos();
            ViewBag.Unidad = _catalogoUnidad.ListarUnidad();

            decimal[] alicuotas = new decimal[] { 0, 10.5M, 21.0M, 27};
            ViewBag.Alicuota = alicuotas;

            return View(_catalogoProductos.ListarProductos().OrderBy(x => x.Nombre).ToList());
        }
        [ValidateInput(false)]
        public ActionResult EditProductosPartial()
        {
            List<Perfil> perfiles = RecuperarPerfil();

            ViewBag.PermisoDelete = perfiles.Exists(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCreate = perfiles.Exists(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEdit = perfiles.Exists(per => per.Permiso.Nombre == "Edit");

            ViewBag.TipoProductos = _catalogoTipoProducto.ListarTipoProductos();
            ViewBag.Unidad = _catalogoUnidad.ListarUnidad();

            decimal[] alicuotas = new decimal[] { 0, 10.5M, 21.0M, 27 };
            ViewBag.Alicuota = alicuotas;

            return PartialView("EditProductosPartial", _catalogoProductos.ListarProductos().OrderBy(x => x.Nombre).ToList());
        }
                
        [HttpPost, ValidateInput(false)]
        public ActionResult EditProductosAddNewPartial(Producto producto)
        {

            int idTipoProducto = String.IsNullOrEmpty(Request.Params["IdTipoProducto"]) ? -1 : int.Parse(Request.Params["IdTipoProducto_VI"]);

            if (idTipoProducto != -1)
            { producto.TipoProducto = _catalogoTipoProducto.BuscarTipoProducto(idTipoProducto); }
            else { ModelState.AddModelError("IdTipoProducto", "Seleccione tipo de producto"); }

            if (ModelState.IsValid)
            {
                try
                {
                    producto.TipoProducto = _catalogoTipoProducto.BuscarTipoProducto(producto.TipoProducto.IdTipoProducto);
                    producto.Unidad = _catalogoUnidad.BuscarUnidad(producto.Unidad.IdUnidadMedida);
                    _catalogoProductos.AgregarProducto(producto);
                }
                catch (Exception e)
                {
                    ViewData["EditError"] = e.Message;
                }
            }
            else
                ViewData["EditError"] = "Por Favor, modifica los errores.";

            List<Perfil> perfiles = RecuperarPerfil();

            ViewBag.PermisoDelete = perfiles.Exists(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCreate = perfiles.Exists(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEdit = perfiles.Exists(per => per.Permiso.Nombre == "Edit");
            ViewBag.TipoProductos = _catalogoTipoProducto.ListarTipoProductos();
            ViewBag.Unidad = _catalogoUnidad.ListarUnidad();

            return PartialView("EditProductosPartial", _catalogoProductos.ListarProductos().OrderBy(x => x.Nombre).ToList());
        }
        [HttpPost, ValidateInput(false)]
        public ActionResult EditProductosUpdatePartial([ModelBinder(typeof(DevExpressEditorsBinder))]Producto producto)
        {
            
            int idTipoProducto = String.IsNullOrEmpty(Request.Params["IdTipoProducto"]) ? -1 : int.Parse(Request.Params["IdTipoProducto_VI"]);

            if (idTipoProducto != -1)
            { producto.TipoProducto = _catalogoTipoProducto.BuscarTipoProducto(idTipoProducto); }
            else { ModelState.AddModelError( null,"Seleccione tipo de producto"); }


            int IdUnidadMedida = String.IsNullOrEmpty(Request.Params["IdUnidadMedida"]) ? -1 : int.Parse(Request.Params["IdUnidadMedida_VI"]);

            if (IdUnidadMedida != -1)
            { producto.Unidad = _catalogoUnidad.BuscarUnidad(IdUnidadMedida); }
            else { ModelState.AddModelError(null, "Seleccione Unidad"); }


            if (ModelState.IsValid)
            {
                try
                {
                    producto.TipoProducto = _catalogoTipoProducto.BuscarTipoProducto(producto.TipoProducto.IdTipoProducto);
                    producto.Unidad = _catalogoUnidad.BuscarUnidad(producto.Unidad.IdUnidadMedida);
                    _catalogoProductos.ModificarProducto(producto);
                }
                catch (Exception e)
                {
                    ViewData["EditError"] = e.Message;
                }
            }
            else
                ViewData["EditError"] = "Por Favor, modifica los errores.";

            List<Perfil> perfiles = RecuperarPerfil();

            ViewBag.PermisoDelete = perfiles.Exists(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCreate = perfiles.Exists(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEdit = perfiles.Exists(per => per.Permiso.Nombre == "Edit");
            ViewBag.TipoProductos = _catalogoTipoProducto.ListarTipoProductos();
            ViewBag.Unidad = _catalogoUnidad.ListarUnidad();

            return PartialView("EditProductosPartial", _catalogoProductos.ListarProductos().OrderBy(x => x.Nombre).ToList());
        }
        [HttpPost, ValidateInput(false)]
        public ActionResult EditProductosDeletePartial(int IdProducto, DetallePedido det)
        {
            if (IdProducto >= 0)
            {
                Producto oProducto = _catalogoProductos.BuscarProducto(IdProducto);

                if (_catalogoPedidos.ListarPedidos().Any(x => x.DetallePedidos.Any(y => y.Producto.IdProducto == IdProducto)))
                {
                            
                            ViewData["EditError"] = "El producto esta asignado a un pedido";
                }
                else
                    //if (_catalogoReceta.ListarRecetas().Any(x => x.RecetaDetalles.Any(y => y.Producto.IdProducto == IdProducto)))
                    //{

                    //    ViewData["EditError"] = "El producto esta asignado a una receta";
                    //}

                    //else
                   {
                       //todo agregar validacion si existe en productos
                       try
                       {
                           _catalogoProductos.EliminarProducto(oProducto);
                       }
                       catch (Exception e)
                       {
                           ViewData["EditError"] = e.Message;
                       }
                   }

               
            }

            List<Perfil> perfiles = RecuperarPerfil();

            ViewBag.PermisoDelete = perfiles.Exists(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCreate = perfiles.Exists(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEdit = perfiles.Exists(per => per.Permiso.Nombre == "Edit");
            ViewBag.TipoProductos = _catalogoTipoProducto.ListarTipoProductos();
            ViewBag.Unidad = _catalogoUnidad.ListarUnidad();

            return PartialView("EditProductosPartial", _catalogoProductos.ListarProductos().OrderBy(x => x.Nombre).ToList());
        }


        //Ejemplos funcionando
        public ActionResult ListadoDePrecios()
        {
            DtoProductoPorMes oDtoProductoPorMes = new DtoProductoPorMes();
            return View(oDtoProductoPorMes);
        }
        public ActionResult ListadoDePreciosDocumentViewerPartial()
        {

            Reportes.ListatadoDePrecios report = new Reportes.ListatadoDePrecios();
            string idsessionreporte = "Reporte";

            CatalogoProductos catalogo = new CatalogoProductos();

            report.DataSource = catalogo.ListarProductos();
            ViewData["Report"] = report;
            System.Web.HttpContext.Current.Session[idsessionreporte] = report;

            return PartialView("ListadoDePreciosDocumentViewerPartial");
        }
        public ActionResult ListadoDePreciosDocumentViewerExportTo()
        {
            string idsessionreporte = "Reporte";
            Reportes.ListatadoDePrecios rpt = (Reportes.ListatadoDePrecios)System.Web.HttpContext.Current.Session[idsessionreporte];
            return DocumentViewerExtension.ExportTo(rpt);
        }




        public ActionResult ListadoDeVentas()
        {
            DtoProductoPorMes oDtoProductoPorMes = new DtoProductoPorMes();
            return View(oDtoProductoPorMes);
        }

        [HttpPost, ValidateInput(false)]
        public ActionResult ListadoDeVentas(DtoProductoPorMes oDtoProductoPorMes)
        {
            System.Web.HttpContext.Current.Session["fechareporte"] = oDtoProductoPorMes.Fecha;
            return View("ListadoDeVentasEnvio");
        }
        public ActionResult ListadoDeVentasDocumentViewerPartial()
        {
            DateTime fecha = (DateTime)System.Web.HttpContext.Current.Session["fechareporte"]; 
            Reportes.ListatadoDeVentas report = new Reportes.ListatadoDeVentas();
            string idsessionreporte = "Reporte";

            CatalogoPedidos catalogo = new CatalogoPedidos();

            List<DtoProductoPorMes> listProductoPorMes = new List<DtoProductoPorMes>();
            Pedido oPedidos = new Pedido();

            List<Pedido> Pedidos = catalogo.ListarPedidos().Where(x => x.Fecha.Month == fecha.Month).ToList();
            
            foreach (Pedido ped in Pedidos)
            {
               foreach (DetallePedido det in ped.DetallePedidos)
               {
                if (listProductoPorMes.Any(x => x.Producto.IdProducto == det.Producto.IdProducto))
                {
                 listProductoPorMes.FirstOrDefault(x => x.Producto.IdProducto == det.Producto.IdProducto).CantidadPorMes =
                 listProductoPorMes.FirstOrDefault(x => x.Producto.IdProducto == det.Producto.IdProducto).CantidadPorMes + det.Cantidad;
                }
                else
                {
                 DtoProductoPorMes oDtoProductoPorMes= new DtoProductoPorMes();
                 oDtoProductoPorMes.Producto = det.Producto;
                 oDtoProductoPorMes.CantidadPorMes = det.Cantidad;
                 oDtoProductoPorMes.Fecha = fecha;
                 listProductoPorMes.Add(oDtoProductoPorMes);
                }
   
               };
           };


            report.DataSource = listProductoPorMes;
            ViewData["Report"] = report;
            System.Web.HttpContext.Current.Session[idsessionreporte] = report;

            return PartialView("ListadoDeVentasDocumentViewerPartial");
        }
        public ActionResult ListadoDeVentasDocumentViewerExportTo()
        {
            string idsessionreporte = "Reporte";
            Reportes.ListatadoDePrecios rpt = (Reportes.ListatadoDePrecios)System.Web.HttpContext.Current.Session[idsessionreporte];
            return DocumentViewerExtension.ExportTo(rpt);
        }  

    }
}
